package presentacion;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import controlador.ControladorTSP;
import controlador.ManejadorProperties;

/**
 * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI
 * Builder, which is free for non-commercial use. If Jigloo is being used
 * commercially (ie, by a corporation, company or business for any purpose
 * whatever) then you should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details. Use of Jigloo implies
 * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN
 * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR
 * ANY CORPORATE OR COMMERCIAL PURPOSE.
 */
public class PlanProyectoFrame extends javax.swing.JInternalFrame {

	private static final long serialVersionUID = 984898795368053186L;

	/** Panel desplazable */
	private JSplitPane jSplitPane1;
	
	/** Panel con los botones para control del arbol */
	private JPanel jPanel1;
	
	/** Panel con barras de desplazamiento para el arbol. */
	private JScrollPane jScrollPane1;
	
	/** Boton para guardar el arbol del proyecto*/
	private JButton botonGuardar;
	
	/** Boton para agregar una nueva tarea */
	private JButton buttonAgregarTarea;
	
	/** Boton para agregar un nuevo ciclo. */
	private JButton buttonAgregarCiclo;
	
	/** Arbol de proyecto. */
	private JTree jTree1;

	{
		// Set Look & Feel
		try {
			javax.swing.UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Auto-generated main method to display this JInternalFrame inside a new
	 * JFrame.
	 */
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		PlanProyectoFrame inst = new PlanProyectoFrame(null);
		JDesktopPane jdp = new JDesktopPane();
		jdp.add(inst);
		jdp.setPreferredSize(inst.getPreferredSize());
		frame.setContentPane(jdp);
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}

	/**
	 * Constructor de la clase.
	 * @param tsp Instancia del controlador TSP
	 */
	public PlanProyectoFrame(ControladorTSP tsp) {
		super();
		initGUI();
		customInit();
		this.controladorTSP = tsp;
	}

	/**
	 * Inicializacion de la interfaz grafica.
	 */
	private void initGUI() {
		try {
			this.setPreferredSize(new java.awt.Dimension(558, 423));
			this.setBounds(0, 0, 558, 423);
			setVisible(true);
			this.setTitle("Plan de Proyecto");
			this.setClosable(true);
			this.setMaximizable(true);
			this.setResizable(true);
			{
				jSplitPane1 = new JSplitPane();
				getContentPane().add(jSplitPane1, BorderLayout.CENTER);
				jSplitPane1.setPreferredSize(new java.awt.Dimension(518, 392));
				{
					jPanel1 = new JPanel();
					jSplitPane1.add(jPanel1, JSplitPane.RIGHT);
					jPanel1.setPreferredSize(new java.awt.Dimension(339, 390));
					jPanel1.setLayout(null);
					{
						buttonAgregarCiclo = new JButton();
						jPanel1.add(buttonAgregarCiclo);
						buttonAgregarCiclo.setText("Agregar Ciclo");
						buttonAgregarCiclo.setBounds(6, 6, 105, 28);
						buttonAgregarCiclo
								.addActionListener(new ActionListener() {
									public void actionPerformed(ActionEvent evt) {

										agregarCiclo();
									}
								});
					}
					{
						buttonAgregarTarea = new JButton();
						jPanel1.add(buttonAgregarTarea);
						buttonAgregarTarea.setText("Agregar Tarea");
						buttonAgregarTarea.setBounds(123, 6, 106, 28);
						buttonAgregarTarea
								.addActionListener(new ActionListener() {
									public void actionPerformed(ActionEvent evt) {

										agregarTarea();
									}
								});
					}
					{
						botonGuardar = new JButton();
						jPanel1.add(botonGuardar);
						botonGuardar.setText("Guardar");
						botonGuardar.setBounds(12, 356, 73, 28);
						botonGuardar.addActionListener(new ActionListener() {
							public void actionPerformed(ActionEvent evt) {
								try {
									guardarPlan();
								} catch (IOException e) {
									JOptionPane.showMessageDialog(PlanProyectoFrame.this, "Error al guardar el proyecto: "+e.getMessage());
								}
							}
						});
					}
				}
				{
					jScrollPane1 = new JScrollPane();
					jSplitPane1.add(jScrollPane1, JSplitPane.LEFT);
					jScrollPane1.setPreferredSize(new java.awt.Dimension(142,
							390));
					{
						jTree1 = new JTree(model);
						jScrollPane1.setViewportView(jTree1);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// CODIGO

	/** Nodo raiz para el arbol. */
	DefaultMutableTreeNode root = new DefaultMutableTreeNode("Proyecto");
	
	/** Modelo de datos usado para el arbol. */
	DefaultTreeModel model = new DefaultTreeModel(root);
	
	/** Instancia del Controlador de TSP*/
	private ControladorTSP controladorTSP;
	
	/**
	 * Iniciacion manual para la clase.
	 */
	private void customInit() {

	}

	/**
	 * Permite agregar una tarea al arbol.
	 */
	private void agregarTarea() {

		TreePath path = jTree1.getSelectionPath();

		if (path == null) {
			JOptionPane.showMessageDialog(this,
					"Debe seleccionar un ciclo de proyecto. ");
			return;
		}

		DefaultMutableTreeNode parent = (DefaultMutableTreeNode) path
				.getLastPathComponent();

		if (!parent.getAllowsChildren() || parent.isRoot()) {
			JOptionPane.showMessageDialog(this,
					"Debe agregar tareas sobre un ciclo de proyecto. ");
			return;
		}

		Ciclo cicloPadre = (Ciclo) parent.getUserObject();

		AgregarTareaDialog diag = new AgregarTareaDialog(null);
		diag.setModal(true);
		diag.setLocationRelativeTo(this);
		diag.setVisible(true);

		if (diag.isCanceled()) {
			return;
		}

		Tarea t = new Tarea();
		t.setNombre(diag.getNombreTarea());
		t.setTiempo(diag.getTiempoTarea());
		t.setId(diag.getIdTarea());
		t.setCiclo(cicloPadre.getNombre());

		DefaultMutableTreeNode child = new DefaultMutableTreeNode(t);
		child.setAllowsChildren(false);

		model.insertNodeInto(child, parent, parent.getChildCount());
		jTree1.scrollPathToVisible(path);

	}

	/**
	 * Permite agregar un nuevo ciclo al arbol del proyecto.
	 */
	private void agregarCiclo() {
		AgregarCicloDialog diag = new AgregarCicloDialog(null);
		diag.setModal(true);
		diag.setLocationRelativeTo(this);
		diag.setVisible(true);

		if (diag.isCanceled()) {
			return;
		}

		Ciclo c = new Ciclo();
		c.setNombre(diag.getNombreCiclo());

		DefaultMutableTreeNode child = new DefaultMutableTreeNode(c);
		child.setAllowsChildren(true);

		model.insertNodeInto(child, root, root.getChildCount());
		jTree1.scrollPathToVisible(new TreePath(child.getPath()));

	}

	/**
	 * Guarda el plan de proyecto creado mediante un arbol
	 * @throws IOException Excepcion lanzada al ocurrir un problema al guardar el archivo 
	 * con la informacion del arbol del proyecto.
	 */
	public void guardarPlan() throws IOException{
		
		int respuesta = JOptionPane.showConfirmDialog(this, "Desea guardar el plan de Proyecto?");
		
		if(respuesta == JOptionPane.OK_OPTION){
			
//			Map<String, String> mapa = new HashMap<String, String>();
			
			List<Tarea> lista = new ArrayList<PlanProyectoFrame.Tarea>();		
			recorrer(root, lista);			
			
			
			File f = new File(ControladorTSP.RUTA_TASK_PROPERTIES);
			if(!f.exists()){
				f.createNewFile();
			}
			
			ManejadorProperties prop = new ManejadorProperties(f);

			
			for(Tarea t : lista){				
//				mapa.put(t.getId(),t.getCiclo()+"-"+t.getNombre()+"-"+t.getTiempo());
				prop.crearPropiedad(t.getCiclo()+"-"+t.getNombre()+"-"+t.getTiempo(), t.getId());
			}			
	
			JOptionPane.showMessageDialog(this, "Plan de Proyecto guardado correctamente. ");
//			dispose();
			
		}
		else if(respuesta == JOptionPane.CANCEL_OPTION){
			return;
		}
		
		
	}

	/**
	 * Metodo protegido usado para recorrer el arbol, por cada nodo hoja
	 * se guarda la informacion en una lista. El recorrido se realiza de
	 * manea recursiva
	 * @param node Nodo padre a recorrer
	 * @param list LIsta para guardar la informacion de los nodos hojas.
	 */
	protected void recorrer(TreeNode node, List<Tarea> list) {
		int cc = node.getChildCount();
		for (int i = 0; i < cc; i++) {
			TreeNode child = node.getChildAt(i);
			if (child.isLeaf()) {
				Tarea t = (Tarea) ((DefaultMutableTreeNode) child)
						.getUserObject();
				list.add(t);
			} else {
				recorrer(child, list);
			}
		}
	}

	
	/**
	 * Clase interna usada para almacenar la informacion de un ciclo dentro
	 * del arbol de proyecto
	 * @author Paul
	 *
	 */
	public static class Ciclo {

		/** Nombre del ciclo*/
		private String nombre;

		public String getNombre() {
			return nombre;
		}

		public void setNombre(String nombre) {
			this.nombre = nombre;
		}

		@Override
		public String toString() {
			return this.nombre;
		}
	}

	/**
	 * Clase usada para almacenar la informacion de cada tarea
	 * dentro del plan de proyecto.
	 * @author Paul
	 *
	 */
	public static class Tarea {
		
		/** Nombre del ciclo */
		private String ciclo;
		
		/** Nombre de la tarea*/
		private String nombre;
		
		/** Tiempo planeado*/
		private int tiempo;
		
		/** Identificador del responsable*/
		private String responsable;
		
		/** Identificador de la tarea*/
		private String id;

		public String getNombre() {
			return nombre;
		}

		public void setNombre(String nombre) {
			this.nombre = nombre;
		}

		public String getResponsable() {
			return responsable;
		}

		public void setResponsable(String responsable) {
			this.responsable = responsable;
		}

		public int getTiempo() {
			return tiempo;
		}

		public void setTiempo(int tiempo) {
			this.tiempo = tiempo;
		}

		public String getId() {
			return id;
		}

		public void setId(String id) {
			this.id = id;
		}

		public String getCiclo() {
			return ciclo;
		}

		public void setCiclo(String ciclo) {
			this.ciclo = ciclo;
		}

		@Override
		public String toString() {
			return nombre;

		}
	}

}
